package org.moonlight.jvm.classfile.constant.info;

import lombok.Getter;
import org.moonlight.jvm.classfile.ClassReader;
import org.moonlight.jvm.classfile.constant.ConstantInfo;

/**
 * 字符串常量在常量池中使用 CONSTANT_Utf8_info 类型存储，CONSTANT_Utf8_info常量里放的是MUTF-8编码的字符串。
 * 字符串在class文件中是以MUTF-8（Modified UTF-8）方式编码的。MUTF-8编码方式和UTF-8大致相同，但并不兼容。差别有两点：
 *   一是null字符（代码点U+0000）会被编码成2字节：0xC0、0x80；
 *   二是补充字符（Supplementary Characters，代码点大于U+FFFF的Unicode字符）是按UTF-16拆分为代理对（Surrogate Pair）分别编码的。
 *
 * JVM规范对其结构定义如下:
 *   CONSTANT_Utf8_info {
 *       u1  tag
 *       u2  length
 *       u1  bytes[length]
 *   }
 *
 *
 * {@link ConstantInfo#CONSTANT_UTF8}
 *
 * @author Moonlight
 * @createTime 2023/8/15 11:02
 **/
public class ConstantUtf8Info implements ConstantInfo {

    @Getter
    private String val;

    @Override
    public void readInfo(ClassReader reader) {
        int length = reader.readUint16();
        this.val = new String(reader.readBytes(length));
    }

    @Override
    public int tag() {
        return ConstantInfo.CONSTANT_UTF8;
    }
}
